{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# CS189/289A Spring 2017 Homework 1\n",
    "## Yicheng Chen\n",
    "## SID: 26943685\n",
    "## Kaggle name/email: Eason Chen/chenyc15@berkeley.edu"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### README\n",
    "This notebook includes all the code I wrote for homework 1. \n",
    "\n",
    "*Python version is 3.5.2.*\n",
    "\n",
    "- How to use\n",
    "\n",
    "    To reproduce the results, \n",
    "    \n",
    "    Please put this notebook and the **hw01_data** folder together \n",
    "    \n",
    "    And put the **spam_data_BOW_validation.mat** in hw01_data/spam (along with the orignal spam_data.mat)\n",
    "    \n",
    "\n",
    "- Dependencies\n",
    "\n",
    "    This notebook uses the following packages: "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Import all the required packages first."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "%matplotlib inline\n",
    "import scipy.io\n",
    "import random\n",
    "from random import shuffle\n",
    "from sklearn import svm\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "from skimage.feature import hog\n",
    "from scipy.sparse import vstack\n",
    "\n",
    "pathname = 'hw01_data/' # the data path is in same directory with this notebook"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Problem 1\n",
    "Rarely will you receive “training” data and “validation” data; you will have to partition a validation set yourself. For the MNIST dataset, set aside 10,000 training images as a validation set. For the spam dataset, set aside 20% training samples as a validation set. For the CIFAR-10 dataset, set aside 5,000 training images as a validation set. Be sure to shuffle your data before splitting it to make sure all classes are represented in your partitions.\n",
    "\n",
    "*Target: Splitting the dataset(MNIST, spam and CIFAR-10) into training set and validation set.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "# MNIST\n",
    "mnist = scipy.io.loadmat(pathname + 'mnist/train.mat')\n",
    "shuffle(mnist['trainX'])\n",
    "mnist['validationX'] = mnist['trainX'][:10000]\n",
    "mnist['trainX'] = mnist['trainX'][10000:]\n",
    "scipy.io.savemat(pathname + 'mnist/train_new.mat', mnist, do_compression=True)\n",
    "\n",
    "# SPAM\n",
    "spam = scipy.io.loadmat(pathname + 'spam/spam_data.mat')\n",
    "training_data_size = spam['training_data'].shape[0]\n",
    "validation_idx = random.sample(range(0, training_data_size), int(0.2*training_data_size))\n",
    "training_idx = list(set(validation_idx)^set(range(0, training_data_size)))\n",
    "validation_data = spam['training_data'][validation_idx]\n",
    "validation_labels = spam['training_labels'][0][validation_idx]\n",
    "training_data = spam['training_data'][training_idx]\n",
    "training_labels = spam['training_labels'][0][training_idx]\n",
    "spam['validation_data'] = validation_data\n",
    "spam['validation_labels'] = validation_labels\n",
    "spam['training_data'] = training_data\n",
    "spam['training_labels'] = training_labels\n",
    "scipy.io.savemat(pathname + 'spam/spam_data_validation.mat', spam, do_compression=True)\n",
    "\n",
    "# CIFAR\n",
    "cifar = scipy.io.loadmat(pathname + 'cifar/train.mat')\n",
    "shuffle(cifar['trainX'])\n",
    "cifar['validationX'] = cifar['trainX'][:5000]\n",
    "cifar['trainX'] = cifar['trainX'][5000:]\n",
    "scipy.io.savemat(pathname + 'cifar/train_new.mat', cifar, do_compression=True)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Problem 2\n",
    "Train a linear SVM on all three datasets. Plot the error rate on the training and validation sets versus the number of training examples that you used to train your classifier. The number of training examples in your experiment should be 100, 200, 500, 1,000, 2,000, 5,000, and 10,000.\n",
    "1. For the MNIST dataset, use raw pixels as features. At this stage, you should expect accura- cies between 70% and 90%.\n",
    "2. For the spam dataset, use the provided word frequencies as features. In other words, each document is represented by a vector, where the ith entry denotes the number of times word i (as specified in featurize.py) is found in that document. At this stage, you should expect accuracies between 70% and 90%.\n",
    "3. For the CIFAR-10 dataset, use raw pixels as features. At this stage, you should expect accuracies between 25% and 35%. A warning that training SVMs for CIFAR-10 takes a couple minutes to run as the number of training examples increases. As such, you only need to train SVMs for 100, 200, 500, 1,000, 2,000, and 5,000 examples (not 10,000).\n",
    "We found that SVC(kernel=’linear’) was faster than LinearSVC.\n",
    "\n",
    "*Target: Build simple linear SVM classifiers for dataset with acceptable validation accuracies.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAjQAAAF5CAYAAACIpbAsAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3Xl8VNX9//HXmUDIAiRhCWERRkUQCC5EUKgKaNFiUVxA\niAhoXFDUWqwt1FoBW7W2Ll/tT6poI6EqFUUBQURRiVpAbFJUVBSVARTZCUtIIMv5/XGTMElmskyW\nmSHv5+Mxjzhnzj3zmRDJm3vPOddYaxEREREJZ65gFyAiIiJSVwo0IiIiEvYUaERERCTsKdCIiIhI\n2FOgERERkbCnQCMiIiJhT4FGREREwp4CjYiIiIQ9BRoREREJewo0IiIiEvZCItAYY84zxiw2xvxo\njCk2xlxWg2OGGGOyjDH5xphvjDETffQZbYz5yhiTZ4z51BgzvGE+gYiIiARTSAQaIBZYB0wGqr25\nlDHGDSwB3gVOB54AnjPGDPPqMwh4CXgWOANYBCw0xvSu59pFREQkyEyo3ZzSGFMMXG6tXVxFn4eB\n4dba07za5gFx1tpLSp7/G4ix1l7m1Wc18D9r7eQG+wAiIiLS6ELlDE1tnQOsqNC2HBjo9XxgDfqI\niIjIcSBcA00SsKNC2w6gtTGmRTV9khq4NhEREWlkzYJdQCgxxrQFLgY8QH5wqxEREQkrUYAbWG6t\n3dPYbx6ugWY70KFCWwfggLX2SDV9tlcx7sXAi/VSoYiISNM0DmdRTqMK10CzGqi4BPuiknbvPhcC\nT3q1DavQpyIPwAsvvEBcXC9mzoSbb4bZs2H6dKdDxbZOnaovdtu2wI6riYYcu6GV1n706BQiIx8P\nydqLi6Gw8NijoKD884Zoq6o9kPGKinx9sinA4wF9T1wuaN4cmjUr/6hpW01f937t0CFYuhSGD4eV\nK+Gee6BXLzCmDn+4jWzKlCk8/nhg33MJjL7njeurr77i2muvhZLfpY0tJAKNMSYW6A6U/vV0kjHm\ndGCvtXarMeYhoJO1tnSvmaeB20pWO6XjBJdRwCVewz4BrDTG3AUsBVKBFOCmKkrJB4iL68Vjj/Xj\nlVfA7YZhwyA11fnL07stLQ3S053n/ng8cPfdtT+uJhpy7IbmXfuvfhXHk0/2C5vaw421TtDxfowb\nF8fs2f3KtR09WrlfQ7Xl5tb+WIB//MP5On48tGgBXbrACSf4f8THh07oiYuLo1+/fsEuo0nR9zxo\ngjJlIyQCDXAW8D7OHjQWeLSkPQNIw5nIe0JpZ2utxxjzS5x/Yv4K+AG4wVq7wqvPamPMNcADJY+N\nwEhr7ZfVFTNz5rGQUMoY5xdDKbfb+eVb1S9hj6fy6zU5riYacuyGFs61hyNjIDLSeZSKigqv7/Gm\nTc7Pxq9+BQ8+CDfeCEeOwNatzuO775wzN9u2lT8jFRtbdeA54QRo2TJoH0tE6lFIBBprbSZVrLiy\n1l7vo+0DnDMuVY27AFhQ23qmTy//l31mJrz00rH/rvhL2LvNW2am71/O1R1XEw05dkML59ql8Xk8\ncMMN8Pzzzs/FmWf6D75FRfDTT8eCzg8/HPvv9eth2TLYvr38P07i451g4+9sT5cuEB3diB9YRAIS\nEoEm1FScxzHR66YKvn4J+/vlO7HSzRhqdlxNNOTYDS2ca5fGVduzeRERTgDp0gUG+tlx6uhR50xO\nadDxfnzyCbz2GuzeXf6Ydu2qPsvTubMz50dEgkeBRoIuNTU12CU0OeHyPW+Is3mRkdUH57y88md3\nvB+Zmc7X/fuP9TcGkpKqDj1jxoTH9/x4Ei4/51I/Qu7WB8FkjOkHZGVlZWkimYhU6eDB8kHHVwDK\nzT3WPyLCOftbVehp395ZRSYSjrKzs0lJSQFIsdZmN/b76wyNiEgAWrWC3r2dhy/WQk6O77M8W7fC\nf//rhKAjR44dExlZ/cqthITQWbklEkoUaEREGoAxTvhISIDTTvPdx1rYtct34Nm0CT74AH78sfzK\nrZiY6ldutWrVOJ9RJJQo0IiIBIkxkJjoPFL8rNksKnJWZlUMPD/8AF9+CcuXOyu7vGcPxMVVf6ZH\nK7fkeKNAIyISwiIinFVUnTvDOef47lNQ4H/lVlYWLFzonAny1rZt9Su3vPcuEgl1CjQiImGueXPo\n1s15+JOf73/l1ocfOl9zco71NwY6dKg69CQlObemEAkF+lEUEWkCoqKge3fn4c+hQ/4nMb/9tvP1\n0KFj/SMioGPHqkNPYqJWbknjUKARERHAuQ1Er17Owxdrnf13/IWe7Gzna8WVW507Vx162rTRyi2p\nOwUaERGpEWOcW0XEx0Pfvr77WOvstOwr8GzeDB995KzcKiw8dkx0dPUrt1q3bpzPKOFLgUZEROqN\nMc4Gge3bg7/9SYuKYMcO36Hnq6/gnXeclVvFxceOad26+pVbMTGN8xklNCnQiIhIoyrdNblTJzj7\nbN99CgrK32jU+/G//8HixbBzZ/lj2rSpfuVWixYN//kkOBRoREQk5DRvDl27Og9/8vOdy1e+Qs9/\n/uN83bev/DHVrdzq2FErt8KV/thERCQsRUXBySc7D39yc/1PYn7nncort1yuY/fc8neJq0MHrdwK\nRQo0IiJy3IqNhVNPdR6+WAsHDvgPPevWOV/z848d07x59Su32rbVyq3GpkAjIiJNljHOrSLi4iA5\n2Xcfa2HPHv+hZ9Uq59JXQcGxY6Kjq5/EHBfXOJ+xqVCgERERqYIx0K6d8zjzTN99iov9r9z6+mtY\nsaLyyq1WraoPPbGxjfMZjwcKNCIiInXkcjkTijt2hAEDfPcpLHTuueXrFhSffgpLljihyFtCQtWB\np0sXrdwqpUAjIiLSCJo1q37l1pEj/ldurV4N8+fD3r3lj0lMrDr0dOrUNFZuNYGPKCIiEh5atICT\nTnIe/uTm+r/R6LvvOl8PHjzWv/TsUVWXt5KSAlu5lZEBgweD2137Y+ubAo2IiEgYiY2Fnj2dhz8V\n77nlHYA++8z5mpd3rH+zZtWv3GrXrvLKrcGDIS0N0tMb5rPWhgKNiIjIcaYmK7f27vW/cmvNGicE\nea/cioryfZZn/Hi4+mr4zW8a57P5o0AjIiLSxBjj7JXTti2ccYbvPsXFzu0lfAWejRvhvfecSc6l\nK7fGjm28+n1RoBEREZFKXC5nbk1SEvTv77tPYeGxe27NmQPPPtuoJZajQCMiIiIBadbMuexUVOTc\nNDSYdDcKERERCZjH40wMnj49uHXoDI2IiIgEpDTMpKdX3h+nsekMjYiIiAQkM9MJM9qHRkRERMLW\nxInBruAYnaERERGRsKdAIyIiImFPgUZERETCXsgEGmPMbcaYTcaYPGPMGmOMn218yvX/0hhz2Bjz\nlTFmfIXXJxpjio0xRSVfi40xhxv2U4iIiEgwhMSkYGPMGOBR4GZgLTAFWG6M6WGt3e2j/63AA8CN\nwH+Bs4FnjTF7rbVLvbruB3oApbfTsg33KURERCRYQuUMzRTgGWvtXGvtBuAW4DCQ5qf/tSX9X7XW\neqy1LwOzgakV+llr7S5r7c6Sx64G+wQiIiISNEEPNMaY5kAK8G5pm7XWAiuAgX4OawHkV2jLBwYY\nYyK82loaYzzGmC3GmIXGmN71WLqIiIiEiKAHGqAdEAHsqNC+A0jyc8xy4EZjTD8AY8xZwA1A85Lx\nAL7GOcNzGTAO57OuMsZ0qtfqRUREJOhCYg5NAP4EdABWG2NcwHZgDvA7oBjAWrsGWFN6gDFmNfAV\nMAkI8h0nREREpD6FQqDZDRThBBRvHXCCSiXW2nycMzSTSvr9hBNUDvqbJ2OtLTTG/A/oXl1BU6ZM\nIS4urlxbamoqqamp1R0qIiJy3Js3bx7z5s0r17Z///4gVeMwznSV4DLGrAE+ttbeWfLcAFuAJ621\nf6vhGCuBrdba8X5edwFfAEuttXf76dMPyMrKyqJfv361/yAiIiJNVHZ2NikpKQAp1trsxn7/UDhD\nA/AYMMcYk8WxZdsxOJeRMMY8BHSy1k4seX4KMAD4GGgD3AX0ASaUDmiM+SPOJadvgXicy1Fdgeca\n5ROJiIhIowmJQGOtnW+MaQfcj3MJaR1wsdfloyTgBK9DIoDf4OwxUwC8Dwyy1m7x6pOAs5Q7CdgH\nZAEDS5aFi4iIyHEkJAINgLV2FjDLz2vXV3i+AajympC19i6cMzciIiJynAuFZdsiIiIidaJAIyIi\nImFPgUZERETCngKNiIiIhD0FGhEREQl7CjQiIiIS9hRoREREJOwp0IiIiEjYU6ARERGRsKdAIyIi\nImFPgUZERETCngKNiIiIhD0FGhEREQl7CjQiIiIS9hRoREREJOwp0IiIiEjYU6ARERGRsKdAIyIi\nImFPgUZERETCngKNiIiIhD0FGhEREQl7CjQiIiIS9hRoREREJOwp0IiIiEhAMtZl4MnxBLsMQIFG\nREREAjTYPZi0RWkhEWoUaERERCQg7ng36SPTSVuUxraD24JaS7OgvruIiIiErKLiInLyc9ibt5e9\neXvZl7/P+Zq3r9zzCFcEqa+mBrVWBRoREZHjmLWW3IJcn0Gk9Hm5Nq/X9h/Z73PM5q7mtIluQ5vo\nNiREJ9Amug3JicmsYU0jf7pjFGhERETCQEFRQdVBJG8fe/Mrh5a9eXspLC70OWZ8VLwTSqKcUNI2\npi2ntDmlLKSUtnsHl4SoBGKax2CMKRvHk+Nh9BOjG+tb4ZMCjYiISCOx1nLgyIEqL9/4e+3Q0UM+\nx4xuFl0pgPRs15M2UZWDiPfzuBZxRLgi6vyZPDke0halMX3IdC7l0jqPFygFGhERkVrKL8yv9eWb\nvXl7ycnPocgWVRrPZVwkRCWUhY020W3o2LIjfdr3qRREKp41iWoWFYTvgKM0zKSPTGfv93uDVgco\n0IiISBNVVFzE/iP7/V++8RFMSl/LK8zzOWbLyJaVAkjnVp2rvHzTJroNrVq0wmXCb+FxpieT9JHp\nuOPd7EWBRkREJCDWWg4XHK768o2fuSX78/djsZXGbOZqVukSTde4rpzR4Qy/l29Kz65ERkQG4bsQ\nPBPPmBjsEsoo0IiISNAVFheyL29f5SBSxeWb0rajRUd9jtm6RetjZ0RKAsiJ8SdWefmmTXQbYpvH\nlpvwKuEhZAKNMeY24G4gCfgUuMNa+0k1/W8D3MBm4EFr7b8q9BkN3F/S5xtgmrV2WUPULyLS1Flr\nOXj0oN+5JVVNej149KDPMVtEtKgUQLq36V7l5ZuE6ATio+Jp5gqZX3HSCELiT9sYMwZ4FLgZWAtM\nAZYbY3pYa3f76H8r8ABwI/Bf4GzgWWPMXmvt0pI+g4CXgKnAUmAcsNAYc6a19stG+FgiImHpSOER\n9uXv83/5xs9Zk335+3wuDzaYY8uDS8JHYmwiPdv29Hv5pjSsRDePDsJ3QMJRSAQanADzjLV2LoAx\n5hbgl0Aa8Fcf/a8t6f9qyXOPMaY/x8ILwK+AZdbax0qe32eMGQbcDkxumI8hIhIaim1x2fLgqjZU\n83XW5HDBYZ9jxjSPqRRAerfrXe2eJXFRcWE54VXCS9ADjTGmOZACPFjaZq21xpgVwEA/h7UA8iu0\n5QMDjDER1tqikmMfrdBnOTCyXgoXEWkEeQV5Ae1ZkpOfQ7EtrjRehImoFEA6t+5M38S+Ve5ZkhCV\nQItmLYLwHRCpmaAHGqAdEAHsqNC+A+jp55jlwI3GmEXW2mxjzFnADUDzkvF24MzF8TVmUn0VLiJS\nEzW9H46vSztHio74HLNVZKtye5YkRCXQLa5btXuWtIpspQmvclwKhUATiD8BHYDVxhgXsB2YA/wO\nqPxPklqaMmUKcXFx5dpSU1NJTQ3ujbdEmpqMdRkMdg/GHe+u9Jonx0OmJ7PRlo021v1wTow/kZSO\nKVVOeo2Piqd5RPNG+dwivsybN4958+aVa9u/3/fPeWMJhUCzGyjCCSjeOuAElUqstfk4Z2gmlfT7\nCZgEHLTW7irptr02Y3p7/PHH6devX40/gIg0jMHuwWW7kHqHGu/dSWuroe6H431mxN/9cCo+r3g/\nHJFw4esf+dnZ2aSkpASpohAINNbaAmNMFnAhsBjAOP+HXwg8Wc2xRcC2kmPGAm94vbzaxxjDStpF\nJAy4492kj0wvF2pKw8z//eL/sNaS/VO2/7Mm+ZUnxPq7H05Us6hKe5aU3g+nqkmv9XU/HBGpm6AH\nmhKPAXNKgk3psu0YnMtIGGMeAjpZayeWPD8FGAB8DLQB7gL6ABO8xnwCWGmMuQtn5VMqzuTjmxrh\n84hIHR04coAvdn7B+p3r6RbXjTOfOZPY5rHsyN1BcXExpz99eqVjKt4PJyEqgY4tO9K7Xe8q9yxJ\niErQ8mCRMBcSgcZaO98Y0w5nE7wOwDrgYq/LR0nACV6HRAC/AXoABcD7wCBr7RavMVcbY67B2a/m\nAWAjMFJ70IiElvzCfDbs3sD6nevLHp/v/Jwt+53/nV3GxSltTuH0DqeTuTmTG8+8kbM6neXzrEm4\n3g9HROouJAINgLV2FjDLz2vXV3i+Aah2kou1dgGwoF4KFJE6KSou4tu93x4LLrucrxv3bCy7+3DX\nuK4kJyaTmpxKcmIyyYnJnNruVLYf2k7aojRWTlzJzMyZ/OH8P/icKCwiTVfIBBoROT5Ya/nhwA98\nvvPzcmddvtz1ZdkS5HYx7eib2JdhJw3jrnPuIjkxmd7texMXFVdpPO8JwO54N+nx6T4nCotI06ZA\nIyIB231497HLRDs+LzvrcuDIAQBaRrYkOTGZlI4pTDx9In079CU5MZnE2MQajV8xzIDvicIiIgo0\nIlKtQ0cPlU3QLZ3jsn7nenbkOntXRkZE0qtdL5ITk7m0x6UkJybTN7EvXeO61mlZcqYn02doKQ01\nmZ5M3Ge4fR4rIk2LAo2IlDladLTSBN31O9ezKWcT4EzQ7d6mO8mJyUxKmVQ2z+WUtqc0yJ2Nq9o0\nzx3vVpgRkTIKNCJNUFFxEZtyNjmXibwm6H6z55uyzeO6tO5CcmIyo3qPKgsuvdr10vJmEQlJCjQi\nxzFrLdsObqt0qejLXV+SV5gHQJvoNvRN7MtQ91B+NeBXJCcm0yexD/FR8UGuXkSk5hRoRI4Te/P2\nVtrLZf3O9eTk5wAQ2zyWPol9OL3D6YzrO65sgm6H2A7afl9Ewp4CjUiYyT2ay5e7vqy0n8u2g9sA\n54aHp7Y7leTEZIZ3H142QbdbfDdtOicixy0FGpEQVVBUwDd7vqm0n8v3+77HYjEYTko4ib4d+pJ2\nRlq5CbqREZHBLl9EpFEp0IgEWbEtxpPjqbSXy9e7v6aguACATq06kZyYzOWnXl5ugm5sZGyQqxcR\nCQ0KNCKNxFrL9kPbK81z+WLXFxwuOAxAfFQ8fRP7cl7X85h81uSyCbptotsEuXoRkdCmQCPSAHLy\ncyrt5bJ+53r25O0BILpZNH0S+5CcmMyYPmPKJuh2bNlRE3RFRAKgQCNSB3kFeXy1+6tK+7n8cOAH\nAJq5mtGzbU+SE5P5+Uk/L7tcdGL8iUS4IoJcvYjI8UOBRqQGCosL2bhnY7nl0Ot3rue7fd9RbIsB\nODH+RPp26MuE0yaUBZee7Xpqgq6ISCNQoBHxUmyL2bJ/S6W9XDbs3sDRoqMAJLVMIjkxmRE9RpQF\nl97te9MysmWQqxcRaboUaKTJ2nFoR/k5LiWXiw4dPQRAXIs4khOTGdhlIDf3u7lsgm67mHZBrlxE\nRCpSoJHj3oEjB/hi5xeV9nPZdXgXAFHNoujdvjfJiclceeqVzkZ0HfrSuVVnTdAVEQkTCjRy3Mgv\nzC+7U7T3fi5b9m8BIMJE0KNtD5ITk7l9wO1ll4tOTjhZE3RFRMKcAo00uox1GQx2D8Yd7670mifH\nQ6Ynk4lnTPR7fGFxId/t/a7cpaLPd3zOxr0byybodovrRt8Ofbkm+ZpyE3SjmkU11McSEZEgUqCR\nRjfYPZi0RWmkj0wvF2o8OZ6ydnA2ott6YGuljei+2vUVR4qOAJAYm0hyYjK/6P4L7k68u2yCbusW\nrYPx0UREJEgUaKTRuePdpI9MLxdqsn/K5obFNzCyx0ge+vChsstFB44cAKBVZCuSE5Pp36l/2X2L\n+iT2ITE2McifRkREQoECjQRFt7hupCankvJMChbLvvx9AHy16yt6te9FcmIyl/W4rGyC7gmtT9AE\nXRER8UuBRhqVtZYl3yxhRuYMsn/Kpm9iXz7f+TkzhsxgTJ8xdG/TnWYu/ViKiEjtuIJdgDQNpUGm\n/7P9uezfl9EysiXzrppHu5h2rJy4kkxPJlHNohRmREQkIAo00qCstby58U3Ofu5sLp13KTHNY3hv\nwntkXJ7B7KzZpI9MZ7B7cNmcGk+OJ9gli4hIGFKgkQZhrWXZxmWc889z+OVLv6RFsxa8O+FdMq/L\n5MSEEyutcvKeKKxQIyIitaVAI/XKWsvyb5cz8J8DueSlS2jmasY749/hg+s+4IITL8AYQ6Yns9KS\nbTgWajI9mcEpXkREwpYmLEi9sNbyzvfvMGPlDFb/sJqBXQby9rVv8/OTfl5pdVJVm+a54924z3A3\ncLUiInK8UaCROrHW8u6md5m+cjqrtq7i7M5n89a4t7jo5Iu0zFpERBqNAo0ExFrLe5veY0bmDD7a\n8hEDOg9g2bhlXHzyxQoyIiLS6BRopNbe3/Q+01dO58MtH3JWp7NYes1ShncfriAjIiJBU+tAY4w5\nyVr7fUMUI6FtpWclM1bOIHNzJikdU1iSuoRLTrlEQUZERIIukFVO3xpj3jfGXGuM0a2Lm4BMTyZD\nM4YyNGMoB48eZPHYxXxy0yf8sscvFWZERCQkBBJo+gGfAY8B240xzxhjBtS1EGPMbcaYTcaYPGPM\nGmNM/2r6jzPGrDPG5Bpjthlj/mmMaeP1+kRjTLExpqjka7Ex5nBd62xKPtz8IRdkXMCQjCHsz9/P\norGL+O9N/+XSnpcqyIiISEipdaCx1q6z1t4JdALSgI7AR8aY9caYu4wx7Ws7pjFmDPAoMB04E/gU\nWG6Maeen/8+ADOBZoDcwChgAzK7QdT+Q5PXoVtvamqKPtnzEz+f+nPPnnM/evL28PuZ1sm7O4rKe\nlynIiIhISAp4Yz1rbaG19jVgNDAV6A48Amw1xsw1xnSsxXBTgGestXOttRuAW4DDOIHJl3OATdba\np6y1m621q4BncEJNhTLtLmvtzpLHrlrU1OSs2rqKYf8axnnPn8euw7t47erXyJ6UzeWnXq4gIyIi\nIS3gQGOMOcsYMwv4CbgLJ8ycDAzDOXuzqIbjNAdSgHdL26y1FlgBDPRz2GrgBGPM8JIxOuAEq6UV\n+rU0xniMMVuMMQuNMb1r+vmaktVbV3PxCxfzs/SfsePQDl4d/Sr/m/Q/ruh1BS6jzaRFRCT0BbLK\n6S7geqAn8CYwAXjTWltc0mWTMeY6wFPDIdsBEcCOCu07St6jEmvtKmPMtcDLJROTmwGLgdu9un2N\nc4bnMyAO+C2wyhjT21q7rYa1Hdc+/uFjpq+czvLvlpOcmMwro1/hyl5XKsSIiEjYCWQfmluBdGCO\ntfYnP312AjcEXFU1Ss60PAHMAN7GmcfzCM5lpxsBrLVrgDVex6wGvgIm4czV8WvKlCnExcWVa0tN\nTSU1NbXePkMwrf1xLTNWzmDZt8vo074P80fN56reVynIiIhIjcybN4958+aVa9u/f3+QqnEY5+pO\nEAtwLjkdBq6y1i72ap8DxFlrr/BxzFwgylp7tVfbz4APgY7W2opne0r7zAcKrLXj/LzeD8jKysqi\nX79+dfhUoemTHz9hRuYM3tz4Jr3a9WL64OmM7jNaQUZEROosOzublJQUgBRrbXZjv3+tf5MZY643\nxoz20T7aGOP/roN+WGsLgCzgQq+xTMnzVX4OiwEKK7QVAxbwOXvVGOMC+uLM+WlSsrZlcem8Sxnw\n3AC+3/c9866ax+e3fs6Y5DEKMyIiclwI5LfZ76k83wWcy0z3BFjHY8BNxpgJxphTgadxQsscAGPM\nQ8aYDK/+bwBXGWNuMcacWHJ25gngY2vt9pJj/miMGVby+pnAi0BX4LkAawwpGesy8OR4fL7myfGQ\nsS6D7J+yuWzeZZz17Fls3LORF698kfW3rmds8lgiXBGNW7CIiEgDCmQOTVdgi4/2zSWv1Zq1dn7J\nnjP3Ax2AdcDFXsusk4ATvPpnGGNaArfhzJ3JwVklNc1r2AScfWmSgH04Z4EGliwLD3uD3YNJW5RG\n+sh03PHusnZPjofRr4wmISqBdxa9Q4+2PXjhihcUYkRE5LgWSKDZCZxG5VVMpwN7Ai3EWjsLmOXn\ntet9tD0FPFXFeHfhLCc/Lrnj3aSPTC8Xat7c+CYTF05k9+HddG/TnbmXzyW1byrNXLoHqYiIHN8C\n+U03D3jSGHMQ+KCkbTDOJZ9/11dhUr3SUDP21bFERkTy4ZYP6dq6KxmXZ3BN32sUZEREpMkI5Dfe\nHwE3ziWe0om5LmAugc+hkQDFtYjju73fsTtvN1N/NpU/X/BnBRkREWlyArmX01Fr7RjgVGAccCVw\nsrU2zVp7tL4LFP+stYx/fTw5R3KYP2o+a39cyw8Hfgh2WSIiIo0u4H/KW2u/Ab6px1qklv5vzf+x\ndONS/j7874zuM5r+nfv7nCgsIiJyvAso0BhjugCX4axqivR+rWQyrjSwj7Z8xG/f+S1XnHoFtw9w\n7vjga6KwiIhIUxDIvZwuxLlv0vc4l53W48ypMUCj7wzYFBUVF5G2KI2klkk8P/L5cq+VhppMTybu\nM9zBKVBERKSRBXKG5iHgEWvt9JKVTlfhLOV+EXirPosT3/76n7/y7d5vybwuk7iouEqvu+PdCjMi\nItKkBLJTcC+cFU3grHKKttYeAu4DptZXYeJb1rYs7lt5H9POncZ53c4LdjkiIiIhIZBAk8uxeTM/\nASd7vdauzhWJX4cLDjPutXGc1uE0ZgyZEexyREREQkYgl5zWAOcCXwFvAo8aY/riLN9eU4+1SQW/\nffu3bNm/hexJ2URGRFZ/gIiISBMRSKC5C2hZ8t/TS/57DLCR4/hWA8H25sY3mfXfWcy6ZBantjs1\n2OWIiIim/MvmAAAgAElEQVSElFoFGmNMBNAF+AzAWpsL3NIAdYmXnbk7uX7R9VxyyiXccpa+3SIi\nIhXVag6NtbYIeBvnTtbSCKy13Lj4Rqy1pF+WjjEm2CWJiIiEnEAmBa8HTqrvQsS3Z7Of5Y1v3uC5\ny56jQ8sOwS5HREQkJAUSaO4FHjHGjDDGdDTGtPZ+1HeBTdk3e75hyvIp3NzvZi7reVmwyxEREQlZ\ngUwKfrPk62LAerWbkucRdS1KoKCogGtfu5bOrTrz2MWPBbscERGRkBZIoBla71VIJX/64E9k/5TN\nqhtWERsZG+xyREREQlqtA421NrMhCpFj/rPlPzzw4QPMHDKTAZ0HBLscERGRkBfIzSnPr+p1a+0H\ngZcjB44cYPzr4zmnyzlMO3dasMsREREJC4Fcclrpo817Lo3m0NTBnW/dya7Du1gxYQXNXIH88YiI\niDQ9gaxySqjwSAR+AXwCXFR/pTU9r375KnPWzeHvw//OSQlaGS8iIlJTgcyh2e+j+R1jzFHgMSCl\nzlU1QT8e+JFJSyZxVa+rmHj6xGCXIyIiElYCOUPjzw6gZz2O12QU22KuX3Q9LSJa8MyIZ7QbsIiI\nSC0FMin4tIpNQEdgGrCuPopqav7+8d955/t3ePvat2kb0zbY5YiIiISdQGadrsOZBFzxNMIaIK3O\nFTUxn+/4nKkrpvLrs3/NsJOHBbscERGRsBRIoDmxwvNiYJe1Nr8e6mlS8gvzGffaOLq36c5DP38o\n2OWIiIiErUAmBW9uiEKaonvfu5ev93zN2hvXEtUsKtjliIiIhK1aTwo2xjxpjLndR/vtxpj/q5+y\njn/vfv8uj65+lAcveJDTk04PdjkiIiJhLZBVTlcBH/loXwWMqls5TcO+vH1MXDiRoe6hTBk4Jdjl\niIiIhL1AAk1b4KCP9gNAu7qVc/yz1nLL0lvILcgl4/IMXKY+V86LiIg0TYH8Nv0WGO6jfTjwfd3K\nOb5krMvAk+Mp1/bi5y8y/4v53D/kft7b9F5wChMRETnOBBJoHgP+aoyZaYwZXPK4H/gL8Hj9lhfe\nBrsHk7YorSzUeHI83PbmbVxx6hW8vuF1BrsHB7dAERGR40StA421Nh34DXAD8H7J41rgVmvts/Vb\nXnhzx7tJH5lO2qI0vtv7HeNfH0+ryFbsPryb9JHpuOPdwS5RRETkuBDQBA5r7T+stV2ADkBra+1J\n1tq5dSnEGHObMWaTMSbPGLPGGNO/mv7jjDHrjDG5xphtxph/GmPaVOgz2hjzVcmYnxpjfF0qa1Cl\noeaif13ER1s+IjE2kblXzFWYERERqUeBLNs+0RhzCoC1dpe19lBJ+ynGGHcgRRhjxgCPAtOBM4FP\ngeXGGJ+TjI0xPwMygGeB3jirqwYAs736DAJeKulzBrAIWGiM6R1IjXUR1yKOrQe2AvD4xY8rzIiI\niNSzQM7QzAHO9tF+dslrgZgCPGOtnWut3QDcAhzG/60UzgE2WWufstZuttauAp7BCTWlfgUss9Y+\nZq392lp7H5ANVNpDp6E9tfYpCooLWDB6ATMzZ1aaKCwiIiJ1E0igORNY7aN9Dc6ZkFoxxjQHUoB3\nS9ustRZYAQz0c9hq4ITSS0jGmA7AaGCpV5+BJWN4W17FmA3Ck+Phb6v+xhD3EK7sfWXZnBqFGhER\nkfoTSKCxQGsf7XFARADjtSs5bkeF9h1Aks8CnDMy1wIvG2OOAj8B+yh/9iWpNmM2BE+Oh7GvjuXA\n0QNMPmsyUH6isEKNiIhI/Qgk0HwA/N4YUxZeSv779/jeQbjelcyDeQKYAfQDLsa5aeYzjfH+NZXp\nyeTMpDNJiErg0p6XlrWXhppMT2YQqxMRETl+BHK37ak4oeZrY8yHJW3n4ZyhGRrAeLuBIpwVU946\nANv9HDMN+I+19rGS5+uNMZOBD40xf7DW7ig5tjZjlpkyZQpxcXHl2lJTU0lNTa3u0HKuPe1a7nnv\nHsYmj61080l3vBv3Ge5ajSciIhIK5s2bx7x588q17d+/P0jVOAK52/aXxpjTcC7vnA7kAXOBvwOd\nAxivwBiTBVwILAYwxpiS50/6OSwGOFqhrRjncpgpeb7axxjD8D3/p5zHH3+cfv361fQj+LXi+xVs\nO7iN6864rs5jiYiIhApf/8jPzs4mJSUlSBUFdoYGa+024B4AY0xrYCzwFnAWgc2jeQyYUxJs1uKs\neoqhZNWUMeYhoJO1dmJJ/zeA2caYW3Am+nbC2aX4Y2tt6RmYJ4CVxpi7cCYLp+JMPr4pgPoCkvFp\nBqe2O5X+narcUkdERETqKOA7IxpjzjfGZADbgLtxdgw+J5CxrLXzS8a4H/gfcBpwsbV2V0mXJOAE\nr/4ZwF3AbcDnwMvAVzh3Ai/tsxq4BrgZWAdcCYy01n4ZSI21tT9/P69veJ3rTr8O54STiIiINJRa\nnaExxiQB1+Hc9qA1MB9oAVxe16BgrZ0FzPLz2vU+2p4CnqpmzAXAgrrUFaj5X8znaNFRrj3t2mC8\nvYiISJNS4zM0xpg3gK9xzp78GucS0B0NVVi4m/PpHIadNIzOrWs9rUhERERqqTZnaIbjTLD9h7V2\nYwPVc1zYuGcjq7au4qUrXwp2KSIiIk1CbebQnAu0ArKMMR8bY273d6+lpi7j0wxat2jN5adeHuxS\nREREmoQaBxpr7Rpr7U1AR5wN7MbiTAh2AcOMMa0apsTwUmyLmfvpXMb2GUt08+hglyMiItIk1HqV\nk7U211qbbq09F+iLc5fsacBOY8zi+i4w3Ly/6X22HtjKxDMmVt9ZRERE6kXAy7YBSu5i/TugC84+\nL01exqcZnNLmFAZ2adR7YIqIiDRpdQo0pay1Rdbahdbay+pjvHB18MhBFny1gImnT9TeMyIiIo2o\nXgKNOF798lXyCvIYf/r4YJciIiLSpCjQ1KM5n87hghMvoGtc12CXIiIi0qQo0NST7/d9zwebP9CN\nKEVERIJAgaaezP10Lq0iW3HFqVcEuxQREZEmR4GmHhTbYjI+zWB079HERsYGuxwREZEmR4GmHny4\n+UM8OR5dbhIREQkSBZp6MOfTOZyUcBLndj032KWIiIg0SQo0dXTo6CFe+eIV7T0jIiISRAo0dfTa\nV6+RW5DLhNMnBLsUERGRJkuBpo4yPs1giHsI7nh3sEsRERFpshRo6mBzzmbe2/QeE0/XjShFRESC\nSYGmDv712b+IbR7LqN6jgl2KiIhIk6ZAEyBrLRmfZjCq9yhaRrYMdjkiIiJNmgJNgFZtXcW3e7/V\n5SYREZEQoEAToDnr5tAtrhuD3YODXYqIiEiTp0ATgMMFh5n/5XwmnD4Bl9G3UEREJNj02zgACzcs\n5MCRA7rcJCIiEiIUaGogY10GnhxP2fM56+ZwbtdzObnNyXhyPGSsywhecSIiIqJAUxOD3YNJW5SG\nJ8fDDwd+YMX3K7ju9Ovw5HhIW5SmeTQiIiJB1izYBYQDd7yb9JHppC1K46yOZxHVLIoBnQeQtiiN\n9JHp2iVYREQkyBRoaqg01CTPSmbQCYO48607FWZERERChAJNLbjj3RQVF/HupndZOXGlwoyIiEiI\n0ByaWtiwawP5Rfncc949zMycWW6isIiIiASPAk0NeXI83LD4BgDO63pe2ZwahRoREZHgU6CpgdLV\nTPecdw8A7WPal5sorFAjIiISXAo0NZDpySR9ZDqREZEAtItpBxybKJzpyQxmeSIiIk1eyAQaY8xt\nxphNxpg8Y8waY0z/Kvo+b4wpNsYUlXwtfXzu1Weijz6HA6lt4hkTcce72X14N3As0IATaiaeoR2D\nRUREgikkAo0xZgzwKDAdOBP4FFhujGnn55BfAUlAx5KvXYC9wPwK/faXvF766FaXOncd3kVUsyhi\nmsfUZRgRERGpZyERaIApwDPW2rnW2g3ALcBhIM1XZ2vtQWvtztIHMACIB+ZU7mp3efXdVZcidx/e\nTbuYdhhj6jKMiIiI1LOgBxpjTHMgBXi3tM1aa4EVwMAaDpMGrLDWbq3Q3tIY4zHGbDHGLDTG9K5L\nraWBRkREREJL0AMN0A6IAHZUaN+Bc5moSsaYjsBw4NkKL32NE3QuA8bhfNZVxphOgRa6+/Bu2se0\nD/RwERERaSDHw07B1wH7gEXejdbaNcCa0ufGmNXAV8AknLk6tbb78G6SWlabsURERKSRhUKg2Q0U\nAR0qtHcAttfg+OuBudbawqo6WWsLjTH/A7pXN+CUKVOIi4sr15aamsquw7tITkyuQUkiIiLHr3nz\n5jFv3rxybfv37w9SNY6gBxprbYExJgu4EFgMYJxZtxcCT1Z1rDFmCHAy8M/q3scY4wL6Akur6/v4\n44/Tr1+/Su13PXqX5tCIiEiTl5qaSmpqarm27OxsUlJSglRRCASaEo8Bc0qCzVqcVU8xlKxaMsY8\nBHSy1lbc8OUG4GNr7VcVBzTG/BHnktO3OCugfgd0BZ4LpEBrrSYFi4iIhKiQCDTW2vkle87cj3Op\naR1wsdcy6yTgBO9jjDGtgStw9qTxJQGYXXLsPiALGFiyLLzWDhw5QGFxoSYFi4iIhKCQCDQA1tpZ\nwCw/r13vo+0A0LKK8e4C7qqv+nztEiwiIiKhIRSWbYeFXYedk0UKNCIiIqFHgaaGdIZGREQkdCnQ\n1FBpoGkb0zbIlYiIiEhFCjQ1tPvwblq3aE1kRGSwSxEREZEKFGhqSLc9EBERCV0KNDWkPWhERERC\nlwJNDe06vEuBRkREJEQp0NSQztCIiIiELgWaGlKgERERCV0KNDWkQCMiIhK6FGhqoLC4kH15+7TK\nSUREJEQp0NTA3ry9WKzO0IiIiIQoBZoa0G0PREREQpsCTQ0o0IiIiIQ2BZoaUKAREREJbQo0NbD7\n8G5cxkVCdEKwSxEREREfFGhqYFfuLtpGt8Vl9O0SEREJRfoNXQPag0ZERCS0KdDUwO48BRoREZFQ\npkBTAzpDIyIiEtoUaGpAgUZERCS0KdDUwK7cXbrtgYiISAhToKkBnaEREREJbQo01cgryCO3IFeB\nRkREJIQp0FRjT94eQLsEi4iIhDIFmmrotgciUlNff/01LpeL+fPn1/rYI0eO4HK5+Otf/9oAlQVm\n+fLluFwu1q5dG+xSRKqlQFMNBRqR8OVyuap9RERE8MEHH9Tbexpj6nRsXY5vCIHW88Ybb/DAAw/U\nczUi/jULdgGhblfuLgDax2qVk0i4eeGFF8o9z8jIYMWKFbzwwgtYa8vae/XqVS/v17NnT/Ly8oiM\njKz1sS1atCAvL4/mzZvXSy3BtnjxYl588UX+8Ic/BLsUaSIUaKqx+/BuWkS0ILZ5bLBLEQmajAwY\nPBjc7sqveTyQmQkTJ4be2Ndcc02556tXr2bFihWkpqbW6Pj8/HyioqJq9Z6BhJn6ODbUeAfGpiyQ\nnyEJjC45VaN0yXaonQYWaUyDB0NamhMwvHk8TvvgwaE5dm2Uzhd5/fXXmTp1Kp07d6Zly5YcPXqU\n3bt3M2XKFJKTk2nZsiXx8fFceumlfPnll+XG8DWHZuzYsbRv356tW7cyYsQIWrVqRYcOHSqdufA1\nh2batGm4XC62bt3KtddeS3x8PG3atGHSpEkcPXq03PGHDx9m8uTJtG3bltatWzNq1Cg2b95c43k5\nmzdv5tJLL6Vly5YkJSXxu9/9joKCgkr93n//fUaNGkXXrl2JiorC7XYzderUcvWkpqaSnp5e9plc\nLhcxMTFlrz/00EMMGjSItm3bEhMTw9lnn83ixYurrbGm71/qiy++4KqrrqJ9+/bExMTQu3dvZs6c\nWa7P1q1bue666+jYsSPR0dF0796dO+64oyyQTZs2jejo6EpjP/3007hcLnbu3FnWlpSUxNVXX83S\npUtJSUkhKiqKuXPnAvDss89ywQUX0KFDB6Kjo+nbty/p6ek+P+Mbb7zB+eefT6tWrYiPj+ecc85h\nwYIF5eo5cOBApeMmTJhAYmIiRUVFNfpeHm90hqYa2oNGxDl7kp7uBIz0dOd5aeAofR6KYwfij3/8\nI7GxsUydOpXc3FwiIiL4+uuveeuttxg1ahTdunXjp59+4umnn2bIkCF8+eWXtGvn/+8IYwwFBQUM\nGzaMIUOG8Mgjj/DWW2/xl7/8hR49ejCxitNPpXNqLr/8cnr06MHDDz/M2rVree655+jUqRPTp08v\n65uamsqSJUtIS0sjJSWFFStWcPnll9foH2OHDh1i6NCh7Nq1iylTptCuXTsyMjJ4++23K/V9+eWX\nKSws5PbbbychIYE1a9bw6KOPsn37djIyMgC444472LFjB6tWreL555/HWktERETZGE888QRjxoxh\nwoQJHDlyhBdeeIErr7ySt99+mwsuuKDKWmvy/gBZWVkMGTKE2NhYJk+ezAknnMDGjRtZunRp2fdt\n69at9O/fn7y8PCZNmkSPHj3YsmUL8+fPp6CggMjISL/zmny1G2P47LPPmDhxIpMnT+aWW26hT58+\nAMyaNYv+/ftzxRVX4HK5WLhwITfeeCPGGK6//vqyMZ5++mkmT57MmWeeyb333kvr1q3Jzs5m+fLl\nXHXVVYwfP56//e1vvPrqq6SlpZUdl5eXx8KFC7nuuuvKfa+bFGutHiUPoB9gs7KybKmrX7naXphx\noRURazdtsvb8862dPdvas86y9o03rM3Kqp/HG284Y86e7bzHpk31X//tt99uXS6Xz9feeusta4yx\nvXv3tgUFBeVeO3LkSKX+GzdutJGRkfaRRx4pa9uwYYM1xtiXX365rG3s2LHW5XLZRx99tNzxffr0\nseedd17Z8/z8fGuMsQ8//HBZ27Rp06wxxt5xxx3ljr3kkkvsCSecUPZ81apV1hhj//CHP5Trl5qa\nal0uV7kxffnLX/5iXS6XXbp0aVlbbm6udbvd1uVy2Y8//rhcnRXNmDHDNmvWzO7cubOs7cYbb7TR\n0dE+36/iGEePHrU9e/a0I0aMqLLO2rz/gAEDbNu2be327dv9jnX11VfbyMhIu379er99pk2b5vNz\nPP3009blctkdO3aUtSUlJVmXy2U//PDDGtU9dOhQm5ycXPZ8z549NiYmxg4ZMqTSz6C3fv362aFD\nh5Zre+mll6zL5bJr1671e1xDy8rKsoAF+tkg/A7XGZpq7MrdRWJsYrDLEAkJbjdcey3cfLPz/NJL\n6/89/vtfmD278c/MlEpLS6NZs/J/NXrPbSkqKmL//v3Ex8dz4oknkp2dXaNxby79ppU499xzWbJk\nSbXHGWOYNGlSubbzzjuP5cuXU1BQQPPmzXnrrbcwxnDrrbeW63fHHXfw73//u9r3WLZsGW63m0su\nuaSsLSYmhhtuuKHcWSBwJi+XOnz4MHl5eQwaNIji4mLWrVvHsGHDqn0/7zFycnIoLCzkZz/7GW+9\n9VatjvX3/j/++COffPIJv//97+nQoYPPcQoLC1myZAmjRo0qO4tSH3r16sW5555bZd379++noKCA\n888/nz//+c8cPXqUyMhIli1bRn5+Pvfcc0+ln0FvEyZM4De/+Q0//vgjnTt3BuDFF1+ke/fu9O/f\nv94+S7hRoKnG7sO76dO+/n7YRcKZxwMvvOAEjtmzYfp06NSpfsbetg1mznTC0gsvwLBhwQk1bh9v\nWlxczCOPPMIzzzzD5s2bKS4uBpyw0b1792rHjI+Pp2XLluXaEhIS2LdvX41q6tq1a6VjrbXk5OTQ\nvn17Nm/eTIsWLcp+uZWqSW3gzJ/p2bNnpXZfbR6Ph3vvvZc333yTnJycsnZjDPv376/R+73++us8\n9NBDfP755xw5cqSs3XuejT81ef/vvvsOoMqgsm3bNvLy8uo1zACceOKJPtszMzOZMWMGa9euJS8v\nr6zdGMOBAwdo165djeoGZ7L7b3/7W+bNm8fdd9/Nnj17ePvtt7nvvvvq74OEoZAJNMaY24C7gSTg\nU+AOa+0nfvo+D0zEObXlfRHzC2ttX69+o4H7ATfwDTDNWrusNnVpDo2Io3ReS0aGEzSGDau/eS4e\nD9x9N7zySv2PXVu+JoDed999PPjgg9xyyy0MHTqUhIQEXC4Xt956a1m4qYq/OQ22hiuB6np8fSks\nLOSCCy4gPz+fe++9lx49ehATE4PH4+Gmm26q0ffinXfe4aqrrmLYsGE888wzJCUl0axZM55++ulq\nz1hV9f433nhjjd6/tvzNQfI38dbXz8+GDRu46KKLOP3003niiSfo0qULkZGRLFy4kKeeeqrWdbdv\n356LL76YF154gbvvvpt///vfFBUVMW7cuFqNc7wJiUBjjBkDPArcDKwFpgDLjTE9rLW7fRzyK2Cq\n1/NmwGdA2dICY8wg4KWSfkuBccBCY8yZ1trySxP8sNYq0Ijge5Kur8m8oTZ2fVmwYAGXXHIJs2bN\nKte+d+9eTj755CBVdUy3bt04cuRIuUsQABs3bqzx8b76btiwodzzrKwsPB4Pr7zyCldddVVZ+5Il\nSyqFK39B4LXXXiMuLo5ly5bhch1baPvUU09VW2dV7++t9M9k/fr1fsfq1KkT0dHRVfYB52zYkSNH\nyi4LlfJUXJZXhUWLFlFYWMibb75ZbgL50qVL/dbdqZpTnxMmTGDs2LGsX7+el156iYEDB/o9O9RU\nhMqy7SnAM9baudbaDcAtwGEgzVdna+1Ba+3O0gcwAIgH5nh1+xWwzFr7mLX2a2vtfUA2cHtNizp4\n9CAFxQUKNNLkZWb6DhalwSMzMzTHri1/v4QjIiIq/cL+17/+xZ49exqjrGpdfPHFWGsrBa6///3v\nNVrldMkll+DxeMr9gj106FClZcWlZ4q8zyhYa3niiScqvU9sbCxHjhwpd0mpdAyXy1XuDMfGjRt5\n8803q62zpu/fuXNnBgwYwOzZs/npp598jtWsWTMuvfRSFixYUGWoOfnkk7HWlttN+sCBA7z44ovV\n1ltV3Xv27Km08ePw4cOJioriwQcf9Llk3ttll11G69atuf/++1m9ejXjx4+vcT3Hq6CfoTHGNAdS\ngAdL26y11hizAhhYw2HSgBXW2q1ebQNxzvp4Ww6MrGltpbsEK9BIU1fVxnZud93OoDTk2LXl7xLO\niBEj+Nvf/sbNN99M//79+fTTT3n55Zd9zrcJhkGDBvHLX/6Sv/zlL2zfvp2zzjqLd999l02bNgHV\n375g8uTJ/OMf/2DMmDHceeedJCYmMmfOHOLj49myZUtZv759+9K1a1fuuOMOvv/+e2JjY5k/fz6H\nDh2qNGZKSgoAt912GxdccAGRkZGMGjWKESNGMGvWLH7xi18wZswYtm3bxqxZszj11FP5+uuvq6yz\nNu////7f/2Po0KGceeaZ3HTTTXTr1o3vvvuO9957j48//hiAhx9+mJUrVzJo0CAmTZpEz549+eGH\nH5g/fz7r1q0jMjKSESNGkJSUxPjx47n77rux1vLPf/6Tzp07s3379qr/YEr84he/4J577mH48OHc\neOON5OTkMHv2bDp37szu3ccuQrRp04ZHHnmE22+/nbPPPpsxY8YQFxfHunXrsNbyzDPPlPVt0aIF\no0eP5rnnniMyMpKrr766RrUc14KxtMr7AXQEioGzK7Q/DKyu4fEFwFUV2o8AYyq03Qr8VMVY5ZZt\nr9m6xjIDu+6ndVZEwt/tt99uIyIifL721ltvVVq6XCovL8/++te/tp06dbItW7a0Q4cOtdnZ2Xbg\nwIH2kksuKeu3YcMG63K5Ki3bTkxMrDTmtGnTbExMTNnz/Px863K57F//+tdyfSIiImxubm65Y30t\nGc7NzbW33nqrbdOmjW3durUdNWqU/eKLL6wxxj755JPVfm88Ho8dMWKEjY2NtUlJSXbq1Kl2yZIl\nlZZtr1+/3l544YW2VatWtkOHDvb222+3WVlZlT53YWGhnTx5sk1MTLQRERHllj7Pnj3bnnLKKTY6\nOtomJyfbl156ye/y6Ipq+v7WWvvZZ5/Zyy+/3LZp08bGxsbaPn362AceeKDS5x4/frxNTEy00dHR\n9pRTTrFTpkyxxcXFZX3Wrl1rBwwYYKOiouxJJ51kZ82a5fPPoGPHjvbqq6/2WffChQtt3759bXR0\ntO3evbt94oknfI5hrbWvv/66HTRokI2NjbXx8fF20KBB9rXXXqs05ocffmiNMfaKK66o9vvWGIK9\nbNvYRp5UVpExpiPwIzDQWvuxV/vDwPnW2irP0hhjfo9zyaqTtbbQq/0IMMFa+7JX263Afdbajn7G\n6gdkDRg0gA5tO7Dj0A7W/riWYScP4/rx1zNw+EAyPZlMPCPAfdhFRBrRmjVrGDRoEAsWLOCKK64I\ndjlSz9auXcs555zDq6++ypVXXtmo7z1v3jzmzZtXrm3//v2ll+ZSrLU128+gHgX9khOwGygCKm4W\n0AGoyfm864G53mGmxPZAxyy+qJgn73ySTE8maxet5Y0/vMFPh34ibVEa6SN9b1UtIhJMvu4Z9MQT\nT9C8eXOf+6JI+Js9ezYJCQmMGDGi0d87NTW10j3RsrOzyy41BkPQA421tsAYkwVcCCwGMM4F3wuB\nJ6s61hgzBDgZ+KePl1f7GGNYSXuVpg+ZTtqiNAZ2GUiryFblwow73l2DTyUi0rj+9Kc/sWHDBs4/\n/3yMMSxZsoR3332XO++8k/bt2we7PKlHixcvZv369WRkZDBt2rTj6qamdRH0S04AxpircVYo3cKx\nZdujgFOttbuMMQ/hXFKaWOG4fwEnW2sH+RhzILAS+D3Osu1UYBrOtT2fy7ZLLzllZWXR5qQ2DJ4z\nmKNFR+nVrpfCjIiEtGXLlvHnP/+ZDRs2kJubS7du3bj++uuZOnWqbq57nOnYsSMHDx5kxIgRPP/8\n8z73vgkGrzM0TfaSE9ba+caYdjib4HUA1gEXW2t3lXRJAk7wPsYY0xq4Amd5tq8xVxtjrgEeKHls\nBEb6CzMVuePd3HXOXfx6+a/591X/VpgRkZA2fPhwhg8fHuwypBH4W4re1IVEoAGw1s4CZvl57Xof\nbVlGmSkAAB9dSURBVAeAlj66e/dZACwIpB5PjodFXy9i5cSVzMycSXq8ztCIiIiEqlDZWC+kbDu4\nrWzOzGD3YNJHppO2KA1PjifYpYmIiIgPCjQ+zFw5s9ycGXe8W6FGREQkhCnQ+DB9yPRKl5dKQ02m\npxH3YRcREZEaCZk5NKGkUyvfNwVzx7txn+Fu3GJERESkWjpDIyIiImFPgUZERETCngKNiEgAunTp\nws0331z2/N1338XlcrFq1apqjz333HO56KKL6rWee++9l+bNm9frmHXx3Xff4XK5eOmll4JdijQR\nCjQictwaOXIksbGx5Obm+u0zbtw4WrRowb59+2o1tq/dd2u6I2+gO/fm5uYyc+ZMPvroI59julzH\nx1/p//nPf5g5cyaHDh0KdikSRo6Pn34RER/GjRtHfn4+r7/+/9u77/gqqrSB47/nhkBC6IpBajaU\nICpSRSAIiggGcSUCIlUBxX1lX2V1RQRBOupHEJCOK0p7VxbEKAisi6uCKG1lFZdiMIAgoiGhSDGE\n5/1j5mbvTW6apJrn+/nMB2bmzDlnTsp9csrM2wHPnz9/nri4OGJiYqhcufIVldWxY0fOnz9PmzYZ\n3sSSZ86ePcu4ceO8bzT281sKADZv3sz48eM5ffp0YVfFFCMW0BhjfrPuueceypUrl+mwx5o1azh3\n7hx9+/bNk/Ly+yWBWb17z+PxFKkhpytRFN4xWBScP3++sKtQrFhAY4zJ1htfvJHpQyUTkhN444s3\nimTeISEhxMbG8o9//IOffvopw/nly5dTvnx5unXrlnbshRdeoG3btlx11VWULVuWli1bsmbNmmzL\nymwOzdy5c6lbty5ly5aldevWAefYXLx4keeee47mzZtTqVIlypUrR4cOHfjkk0/S0sTHx1O9enVE\nhNGjR+PxePB4PEyePBkIPIfm0qVLjBs3jrp16xISEkJkZCRjxowhJSXFL13NmjWJjY3l448/5uab\nbyY0NJR69erleP5LUlISAwYMoFKlSlSpUoXBgwcH7F3ZvXs3AwcOJDIykpCQEK699loefvhhv+G+\n5557jmeffTatXh6Ph6CgII4dOwbAa6+9RseOHQkPDyc0NJQbbriBhQsX5qieOSnf67vvvmPQoEFU\n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\nH5iUae7eoOWiAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb6ab673748>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#MNIST\n",
    "mnist = scipy.io.loadmat(pathname + 'mnist/train_new.mat')\n",
    "all_training_accuracy = []\n",
    "all_validation_accuracy = []\n",
    "all_training_size = [100, 200, 500, 1000, 2000, 5000, 10000]\n",
    "for size in all_training_size:\n",
    "\ttraining_data = mnist['trainX'][:size, :-1]\n",
    "\ttraining_labels = mnist['trainX'][:size, -1:].ravel()\n",
    "\tvalidation_data = mnist['validationX'][:, :-1]\n",
    "\tvalidation_labels = mnist['validationX'][:, -1:].ravel()\n",
    "\tclf = svm.LinearSVC()\n",
    "\tclf.fit(training_data, training_labels)\n",
    "\ttraining_accuracy = clf.score(training_data, training_labels)\n",
    "\tvalidation_accuracy = clf.score(validation_data, validation_labels)\n",
    "\tall_training_accuracy.append(training_accuracy)\n",
    "\tall_validation_accuracy.append(validation_accuracy)\n",
    "plt.plot(all_training_size, all_training_accuracy, label='Training data accuracy', marker='x')\n",
    "plt.plot(all_training_size, all_validation_accuracy, label='Validation data accuracy', marker='x')\n",
    "plt.xlabel('Training set size')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend(loc='lower right', frameon=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "data": {
      "image/png": "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\nL72URo0aUa1aNTp06EB8fHyu9zh79mw6d+5MrVq1qFu3Lueddx5vv/12tnh27959zHm33HILJ554\nIunp6QX6uwx3GoEpQc1qNeP7X79n/J/HH3Mssm4kkR0jSz8okSKIjIT4eC+hiI/33mcmGJnvQ/Ha\nRfHYY49Ro0YNHnjgAfbt20eFChX47rvvmDdvHj179uTkk09m8+bNjB8/nq5du7J69WoaNGiQ5/Wc\nc6SlpXHFFVfQtWtXxowZw7x583jmmWdo3bo1/fIZXsqsibnuuuto3bo1zz77LMuWLePVV1+ladOm\njBgx4mjfmJgY5syZQ2xsLNHR0SxcuJDrrruuQDUse/fu5ZJLLmH79u0MHz6cBg0akJCQwIIFC47p\n+8Ybb3DkyBGGDh1KvXr1WLp0KWPHjmXLli0kJHiLcw4bNoytW7fy+eefM2nSJMyMChV+X338H//4\nB7179+aWW27h0KFDTJ06lb/85S8sWLCASy+9NN9YC/L5AImJiXTt2pUaNWpw++2306JFC9auXcvc\nuXOP/r1t2LCBs88+mwMHDjB48GBat27Nzz//zIwZM0hLS6Ny5cp51iXl1u6cY+XKlfTr14/bb7+d\nIUOG0L59ewDGjRvH2WefTY8ePYiIiOC9997j1ltvxTnHgAEDjl5j/Pjx3H777XTq1IlHH32U2rVr\nk5SUxPz587n++uu5+eabef7553nrrbeIjY09et6BAwd477336N+/f7a/6zLNzPQKvIAowBITEy0Y\nrpp6lZ35nzMtIyMjKNcT8du6dWadO5tNnGh21llms2ebJSYG5zV7tnfNiRO9z1i3LvjxDx061CIi\nInI9Nm/ePHPOWbt27SwtLS3bsUOHDh3Tf+3atVa5cmUbM2bM0bY1a9aYc87eeOONo219+vSxiIgI\nGzt2bLbz27dvbxdffPHR9wcPHjTnnD377LNH2x588EFzztmwYcOyndutWzdr0aLF0feff/65Oefs\nkUceydYvJibGIiIisl0zN88884xFRETY3Llzj7bt27fPIiMjLSIiwr744otsceb0xBNPWMWKFW3b\ntm1H22699VarVq1arp+X8xqHDx+2Nm3a2NVXX51vnIX5/HPOOcfq169vW7ZsyfNavXr1ssqVK9uq\nVavy7PPggw/meh/jx4+3iIgI27p169G2xo0bW0REhH322WcFivuSSy6x008//ej7X3/91apXr25d\n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\nAWCzZs1o0qQJixYtYt26dQwZMuQ33x26JNkVGGNMgQpzC4HI6yJ9HluSdXvVFxlJ27ZtefXVVxGR\nXMNHAL169WLOnDl069aNO+64gx9++IGYmBgaN27s894ZOXkOtwQHB/Pkk08yduxYOnXqxODBg/nq\nq6945ZVXqF+/vtdxvXv3Jj4+nn79+tGjRw8SEhJYuHAhTZo08ZqHExYWRqNGjYiLi6N+/fpUrVqV\npk2b8vvf/z5XLM2bN2fo0KHExMSQlJRE+/bt2bFjBytWrGDQoEG0a9euKB9fnvr27csNN9zA+PHj\nSUhIoHHjxqxZs8ZrfgpAlSpVaNu2LTNnziQ1NZXw8HA2bdrEwYMHcw1TtWjRAlXl0UcfZeDAgQQH\nB3PbbbfRrVs3JkyYQM+ePRk9ejQnTpxg8eLFXHHFFQXev6Qo7T/99NNs3bqV6OhoxowZQ+PGjTl0\n6BCrV6/mo48+onz58kyYMIE1a9bQr18/Ro0aRbNmzUhKSuLVV1/lxRdfpEmTJjRt2pRWrVrx5z//\nmaNHj1KlShXi4uKK9MiH6OhoKlWqxLBhw/jjH//IuXPnWL58efak7ywul4uYmBj69u3Lddddx113\n3UWtWrXYt28f+/fvZ8OGDV7lhw8fzsSJExGRYruR40V3MZY6BcoLW0ZtTKkWExOjLpdL27Rpk2eZ\nJUuWaKNGjTQ0NFSvuuoqXb58ea4lyqqqderU0XvvvTf7va+lsVlt1q9fX0NDQ7VNmzb6/vvva/v2\n7fXmm2/2Kjd9+nSNjIzU8uXLa8uWLXXTpk06bNgwbdSokVe57du3a8uWLTUkJERdLlf2kupJkyZp\n2bJlvcpmZGTo1KlTtX79+lquXDmNjIzUyZMn51qyXadOHe3Xr1+uzyI6OjpXnL4cO3ZMhw8frpUr\nV9Zq1arpqFGjdPfu3bmWUX///ffar18/rVq1qlarVk2HDBmihw8fVpfLpTNmzPCqc9q0aRoREaFl\nypTxWoocHx+vTZs21dDQUI2KitJZs2bp4sWL81x27ako7R88eFBHjBihNWvW1NDQUG3QoIE++OCD\nmpmZmV0mKSlJx44dqxERERoSEqL16tXTe+65R1NSUrLLJCQk6E033aShoaEaHh6uU6ZM0c2bN/tc\nRt28eXOfcW/fvl1vuOEGDQsL04iICJ00aZJu2rTJ58/btm3btGvXrlqpUiWtWLGiNmvWTBcuXJir\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb6a7706588>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "spam = scipy.io.loadmat(pathname + 'spam/spam_data_validation.mat')\n",
    "all_training_accuracy = []\n",
    "all_validation_accuracy = []\n",
    "all_training_size = [100, 200, 500, 1000, 2000, 4000]\n",
    "for size in all_training_size:\n",
    "\tidx = random.sample(range(0, len(spam['training_data'])), size)\n",
    "\ttraining_data = spam['training_data'][idx, :]\n",
    "\ttraining_labels = spam['training_labels'].ravel()[idx]\n",
    "\tvalidation_data = spam['validation_data']\n",
    "\tvalidation_labels = spam['validation_labels'].ravel()\n",
    "\tclf = svm.LinearSVC()\n",
    "\tclf.fit(training_data, training_labels)\n",
    "\ttraining_accuracy = clf.score(training_data, training_labels)\n",
    "\tvalidation_accuracy = clf.score(validation_data, validation_labels)\n",
    "\tall_training_accuracy.append(training_accuracy)\n",
    "\tall_validation_accuracy.append(validation_accuracy)\n",
    "plt.plot(all_training_size, all_training_accuracy, label='Training data accuracy', marker='x')\n",
    "plt.plot(all_training_size, all_validation_accuracy, label='Validation data accuracy', marker='x')\n",
    "plt.xlabel('Training set size')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend(loc='lower right', frameon=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Trained:  100\n",
      "Trained:  200\n",
      "Trained:  500\n",
      "Trained:  1000\n",
      "Trained:  2000\n",
      "Trained:  5000\n"
     ]
    },
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAicAAAF5CAYAAABEPIrHAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XlcVmX+//HXdaOIuIA7Ihjl1mKlkMptmlpjpWmblpGW\nRYtlNuXUfLOyxfbN+mlpZo1po1I2bZZljc1km0tBOtk+JeaumUsqKsjn98cNDLcsIgL3Ad/Px4OH\nnus+1zmf+5YHvL3OdZ3jzAwRERERr/CFugARERGRwhRORERExFMUTkRERMRTFE5ERETEUxRORERE\nxFMUTkRERMRTFE5ERETEUxRORERExFMUTkRERMRTFE5ERETEUzwRTpxzPZ1zc51za51zuc65c8vQ\np7dzLt05t8c596NzbnhV1CoiIiKVyxPhBKgHLANGAgd92I9zLgF4B/gQOBmYALzgnOtbeSWKiIhI\nVXBee/Cfcy4XON/M5payz6NAPzM7qVBbGhBlZv2roEwRERGpJF4ZOTlUycCCA9reB/whqEVEREQq\nUHUNJzHAxgPaNgINnXN1QlCPiIiIVJBaoS6gqjjnmgBnAZnAntBWIyIiUq1EAAnA+2a2pbJPVl3D\nyQagxQFtLYAdZra3hD5nAbMqtSoREZGabSgwu7JPUl3DySKg3wFtZ+a1lyQTYObMmRx33HFFXly3\nDu6+G/r3h9dfh2uvhWbNgvfZvBmmToULLyx5n4pU1eerSPm15+SMplatp6pV7dWVPvPQGT9+NLfc\n8lSoyzii6DOvOps3w4QJ35GZOQzyfpdWOjML+ReBpcQnA52AXODmvO34vNcfBmYU2j8B+AN4FOhA\nYAnyPuBPpZwjEbD09HQ70MqVZn36BP4sbrus+1Skqj5fRSpc68CBA6tV7dWVPvPQGjhwYKhLOOLo\nM68a+T9L3n473Qjc6iPRqiAXeGVC7CnAV0A6gTc/HsgAxuW9HgPE5+9sZpnAOcCfCNwfZTRwlZkd\nuILnoDIzITUVpk2DhIRAW0JCYDs1NfB6WfapSFV9vopUnWuvrvSZi0hlKPyzJTa2as/tics6ZraQ\nUlYOmdmVxbR9DCQd7rkXLgz+oZ4v/4f7woWB7YPtc+BrlV1TRZ6vIlXn2qsrfeYiUhkK/2z5/feq\nPbcnwkkoDS/lpvcJCQf/oV6WfQ7V4dYUStW59upKn7mIVIbSfrZUNq9c1pEaKiUlJdQlHHH0mVc9\nfeZVT595zea529dXFudcIpCenp5OYmJiqMsRERGpNjIyMkhKSgJIMrOMyj6fRk5ERETEUxRORERE\nxFMUTkRERMRTFE5ERETEUxRORERExFMUTkRERMRTFE5ERETEUxRORERExFMUTkRERMRTFE5ERETE\nUxRORERExFMUTkRERMRTFE5ERETEUxRORERExFMUTkRERMRTFE5ERETEUxRORERExFMUTkRERMRT\nFE5ERETEUxRORERExFMUTkRERMRTFE5ERETEUxRORERExFMUTkRERMRTFE5ERETEUzwTTpxzNzjn\nVjrnspxzi51zXcqw/7fOud3Oue+cc5dVVa0iIiJSeTwRTpxzQ4DxwD1AZ2A58L5zrmkJ+18PPAjc\nDRwP3AtMcs6dUyUFi4iISKXxRDgBRgPPmdlLZvY9cB2wG0gtYf9hefv/w8wyzewVYCpwW9WUKyIi\nIpUl5OHEOVcbSAI+zG8zMwMWAP4SutUB9hzQtgfo6pwLq4w6RUREpGqEPJwATYEwYOMB7RuBmBL6\nvA9c7ZxLBHDOnQJcBdTOO56IiIhUU7VCXUA53Q+0ABY553zABmA68H9AbmkdR48eTVRUVFBbSkoK\nKSkplVOpiIhINZKWlkZaWlpQ2/bt26u0Bhe4ghI6eZd1dgODzGxuofbpQJSZXVBK3zACIWU9MAJ4\nxMyiS9g3EUhPT08nMTGxAt+BiIhIzZaRkUFSUhJAkpllVPb5Qn5Zx8yygXTgjPw255zL2/78IH33\nm9m6vDkqlwBvV2atIiIiUvm8clnnSWC6cy4dWEpg9U4kgUs1OOceBmLNbHjedjugK7AEaAz8BTgB\nuLzKKxcREZEK5YlwYmZz8u5pch+ByzTLgLPMbHPeLjFAfKEuYcAtQHsgG/g30N3Mfq26qkVERKQy\neCKcAJjZZGByCa9decD294AmjoiIiNRAIZ9zIiIiIlKYwomIiIh4isKJiIiIeIrCiYiIiHiKwomI\niIh4isKJiIiIeIrCiYiIiHiKwomIiIh4isKJiIiIeIrCiYiIiHiKwomIiIh4isKJiIiIeIrCiYiI\niHiKwomIiIh4isKJiIiIeIrCiYiIiHiKwomIiIh4isKJiIiIeIrCiYiIiHiKwomIiIh4isKJiIiI\neIrCiYiIiHiKwomIiIh4isKJiIiIeIrCiYiIiHiKwomIiIh4isKJiIiIeIpnwolz7gbn3ErnXJZz\nbrFzrstB9h/qnFvmnNvlnFvnnPubc65xVdUrIiIilcMT4cQ5NwQYD9wDdAaWA+8755qWsP+pwAzg\neeB4YDDQFZhaJQWLiIhIpfFEOAFGA8+Z2Utm9j1wHbAbSC1h/2RgpZlNMrNVZvY58ByBgCIiIiLV\nWMjDiXOuNpAEfJjfZmYGLAD8JXRbBMQ75/rlHaMFcBEwr3KrFRERkcoW8nACNAXCgI0HtG8EYorr\nkDdSMgx4xTm3D1gPbAVGVWKdIiIiUgW8EE4OmXPueGACcC+QCJwFHE3g0o6IiIhUY7VCXQDwG7Af\naHFAewtgQwl9xgCfmdmTedsrnHMjgU+cc3ea2YGjMAVGjx5NVFRUUFtKSgopKSnlKl5ERKQmSUtL\nIy0tLaht+/btVVqDC0zvCC3n3GJgiZndlLftgF+BiWb2eDH7/wPYZ2aXFmrzA58CrcysSKhxziUC\n6enp6SQmJlbSOxEREal5MjIySEpKAkgys4zKPp9XLus8CVzjnLvcOXcsMAWIBKYDOOceds7NKLT/\n28Ag59x1zrmj85YWTyAQcEoabREREZFqwAuXdTCzOXn3NLmPwOWcZcBZZrY5b5cYIL7Q/jOcc/WB\nG4AngG0EVvuMqdLCRUREpMJ5IpwAmNlkYHIJr11ZTNskYFJl1yUiIiJVyyuXdUREREQAhRMRERHx\nGIUTERER8RSFExEREfEUhRMRERHxFIUTERER8RSFExEREfEUhRMRERHxFIUTERER8RSFExEREfEU\nhRMRERHxFIUTERER8RSFExEREfEUhRMRERHxFIUTERER8RSFExEREfEUhRMRERHxFIUTERER8RSF\nExEREfEUhRMRERHxFIUTERER8RSFExEREfEUhRMRERHxFIUTERER8RSFExEREfEUhRMRERHxFIUT\nERER8RSFExEREfEUz4QT59wNzrmVzrks59xi51yXUvZ90TmX65zbn/dn/tfXVVmziIiIVDxPhBPn\n3BBgPHAP0BlYDrzvnGtaQpc/AzFAy7w/44DfgTmVX62IiIhUJk+EE2A08JyZvWRm3wPXAbuB1OJ2\nNrM/zGxT/hfQFYgGpldVwSIiIlI5Qh5OnHO1gSTgw/w2MzNgAeAv42FSgQVmtrriKxQREZGqFPJw\nAjQFwoCNB7RvJHDJplTOuZZAP+D5ii9NREREqpoXwsnhugLYCrwV4jpERESkAtQKdQHAb8B+oMUB\n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\nvPFGsa9nZWUxd+5c+vfvT6NGjQ7rXGeccQZZWVl07979sI5Tmp07dzJu3Dg+/vjjIq/VpF/mn376\nKffddx87duwIdSniYQonh+nDXz5k6OtDSTkxhafOfkrPyxGpIueeey7169cv8dLCm2++ye7duxk6\ndGiFnK+yH8BW2j2nfD6fpy7rHA4v3FvLC7KyskJdgqcpnJTBjGUzyNyWWaT9y3Vfcu7L59KhSQde\nPO9FPS9HqqWSvr8BMrdlMmPZDE8ePyIiggsvvJAPP/yQ3377rcjrs2fPpkGDBgwcOLCg7dFHH+XU\nU0+lSZMmREZG0qVLF958882DnqukOSfPPvssbdq0ITIyEr/fX+yclL1793LXXXeRlJREdHQ09evX\np3fv3nzyyScF+/z888/ExsbinGPs2LH4fD58Ph8PPRR4Hmpxc05ycnIYN24cbdq0ISIigmOOOYa7\n776b7OzsoP3i4uK48MIL+fjjj+natSt169albdu2ZZ4vsnXrVi6//HKio6Np3LgxV111VbGjHsuX\nL2f48OEcc8wxRERE0LJlS6655pqgS2p33XVXwcPs4uLi8Pl8hIWFsW7dOgD+9re/ccYZZ9CiRQvq\n1q1Lx44def7558tUZ1nOn2/NmjWkpqYSGxtL3bp1adOmDaNGjSI3Nzfofd90000kJCQQERFB69at\nueKKK9i2bRsAL7zwAj6fr6D2fMV9r/To0YPExES++OILevbsSb169bjnnnsAeOONNzjnnHNo1aoV\nERERtGvXjoceeqjYELdo0SL69etHo0aNqF+/Pp06dWLSpElB9XzzzTdF+t13333Url2bTZs2lemz\n9AL9Ni2DXgm9SH0rNegH7I9bfuTMv59JLV8tXh70MuFhR+ZjraX6K+77GwLBIfWtVHol9PLs8YcO\nHUp2djZz5swJat+6dSsffPABF154IXXq1ClonzhxIklJSTzwwAM8/PDD+Hw+Bg0axAcffHDQcx04\nKvrcc89xww03EB8fz+OPP47f72fgwIFFfllt27aN6dOnc8YZZ/DYY49x7733smHDBs4888yCXyQx\nMTFMmjQJM+Oiiy5i5syZzJw5k/PPP7/g3Aee/4orrmDcuHF069aNp556ip49e/LAAw8wbNiwInX/\n8MMPXHLJJZx99tk8+eSTREVFMXz4cH766adS37OZMXDgQNLS0hg+fDgPPPAAmZmZXHnllUXqef/9\n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\nyv8Dt53VPWKIZ5sAAAAASUVORK5CYII=\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x7fb6ab673630>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cifar = scipy.io.loadmat(pathname + 'cifar/train_new.mat')\n",
    "all_training_accuracy = []\n",
    "all_validation_accuracy = []\n",
    "all_training_size = [100, 200, 500, 1000, 2000, 5000]\n",
    "for size in all_training_size:\n",
    "    training_data = cifar['trainX'][:size, :-1]\n",
    "    training_labels = cifar['trainX'][:size, -1:].ravel()\n",
    "    validation_data = cifar['validationX'][:, :-1]\n",
    "    validation_labels = cifar['validationX'][:, -1:].ravel()\n",
    "    clf = svm.SVC(kernel='linear') # This might be faster than LinearSVC?\n",
    "    clf.fit(training_data, training_labels)\n",
    "    training_accuracy = clf.score(training_data, training_labels)\n",
    "    validation_accuracy = clf.score(validation_data, validation_labels)\n",
    "    all_training_accuracy.append(training_accuracy)\n",
    "    all_validation_accuracy.append(validation_accuracy)\n",
    "    print('Trained: ', size)\n",
    "plt.plot(all_training_size, all_training_accuracy, label='Training data accuracy', marker='x')\n",
    "plt.plot(all_training_size, all_validation_accuracy, label='Validation data accuracy', marker='x')\n",
    "plt.xlabel('Training set size')\n",
    "plt.ylabel('Accuracy')\n",
    "plt.legend(loc='lower right', frameon=False)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Problem 3\n",
    "For the MNIST dataset, find the best C value. In your report, list the best C value, the C values you tried, and the corresponding accuracies. As in the previous problem, you need only train on up to 10,000 examples for performance reasons.\n",
    "\n",
    "*Target: Try different C values to get the optimal hyperparameter for MNIST dataset.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "mnist = scipy.io.loadmat(pathname + 'mnist/train_new.mat')\n",
    "all_training_accuracy = []\n",
    "all_validation_accuracy = []\n",
    "size = 5000\n",
    "all_C = list(range(1, 100)) # all the C values that are tested, might take a few minutes to run\n",
    "validation_data = mnist['validationX'][:, :-1]\n",
    "validation_labels = mnist['validationX'][:, -1:].ravel()\n",
    "training_data = mnist['trainX'][:size, :-1]\n",
    "training_labels = mnist['trainX'][:size, -1:].ravel()\n",
    "for C in all_C:\n",
    "\tclf = svm.LinearSVC(C=C) # try linear or non-linear kernels\n",
    "\tclf.fit(training_data, training_labels)\n",
    "\ttraining_accuracy = clf.score(training_data, training_labels)\n",
    "\tvalidation_accuracy = clf.score(validation_data, validation_labels)\n",
    "\tall_training_accuracy.append(training_accuracy)\n",
    "\tall_validation_accuracy.append(validation_accuracy)\n",
    "\tprint(\"C=\", C, \": \", validation_accuracy)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "***The C that gives maximum accuracy:  39\n",
      "***Accuracy:  0.8972\n"
     ]
    }
   ],
   "source": [
    "max_idx = all_validation_accuracy.index(max(all_validation_accuracy))\n",
    "print(\"***The C that gives maximum accuracy: \", all_C[max_idx])\n",
    "print(\"***Accuracy: \", max(all_validation_accuracy))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Problem 4\n",
    "For the spam dataset, use k-fold cross validation to find and report the best C value. Use k = 5. In your report, list the best C value, the C values you tried, and the corresponding accuracies.\n",
    "\n",
    "*Target: Use 5-fold cross validation to find the best C for spam dataset.*"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# This is a helper function to divide a set into k roughly equal size sets\n",
    "def k_partition(seq, k):\n",
    "\tavg = len(seq) / float(k)\n",
    "\tout = []\n",
    "\tlast = 0.0\n",
    "\twhile last < len(seq):\n",
    "\t\tout.append(seq[int(last):int(last + avg)])\n",
    "\t\tlast += avg\n",
    "\treturn out"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "C= 1 --Average accuracy:  0.804000549101\n",
      "C= 2 --Average accuracy:  0.804485393337\n",
      "C= 3 --Average accuracy:  0.80666105883\n",
      "C= 4 --Average accuracy:  0.806661350905\n",
      "C= 5 --Average accuracy:  0.807628410704\n",
      "C= 6 --Average accuracy:  0.807144442692\n",
      "C= 7 --Average accuracy:  0.803517165238\n",
      "C= 8 --Average accuracy:  0.807869664523\n",
      "C= 9 --Average accuracy:  0.802072855148\n",
      "C= 10 --Average accuracy:  0.808594886354\n",
      "C= 11 --Average accuracy:  0.809077978141\n",
      "C= 12 --Average accuracy:  0.809803199972\n",
      "C= 13 --Average accuracy:  0.808353048385\n",
      "C= 14 --Average accuracy:  0.809803199972\n",
      "C= 15 --Average accuracy:  0.809078270216\n",
      "C= 16 --Average accuracy:  0.808111794566\n",
      "C= 17 --Average accuracy:  0.810529005952\n",
      "C= 18 --Average accuracy:  0.809560485779\n",
      "C= 19 --Average accuracy:  0.81173790372\n",
      "C= 20 --Average accuracy:  0.805936713223\n",
      "C= 21 --Average accuracy:  0.810769091472\n",
      "C= 22 --Average accuracy:  0.806902604723\n",
      "C= 23 --Average accuracy:  0.805210323093\n",
      "C= 24 --Average accuracy:  0.804967900975\n",
      "C= 25 --Average accuracy:  0.807629286928\n",
      "C= 26 --Average accuracy:  0.80762636618\n",
      "C= 27 --Average accuracy:  0.808837600547\n",
      "C= 28 --Average accuracy:  0.809317771586\n",
      "C= 29 --Average accuracy:  0.809802323747\n",
      "C= 30 --Average accuracy:  0.811980033764\n",
      "C= 31 --Average accuracy:  0.809802615822\n",
      "C= 32 --Average accuracy:  0.810287167984\n",
      "C= 33 --Average accuracy:  0.803033781376\n",
      "C= 34 --Average accuracy:  0.803756082459\n",
      "C= 35 --Average accuracy:  0.812702918996\n",
      "C= 36 --Average accuracy:  0.803759879432\n",
      "C= 37 --Average accuracy:  0.810527545578\n",
      "C= 38 --Average accuracy:  0.811252767409\n",
      "C= 39 --Average accuracy:  0.808109750042\n",
      "C= 40 --Average accuracy:  0.806176506668\n",
      "C= 41 --Average accuracy:  0.809804660346\n",
      "C= 42 --Average accuracy:  0.801828096431\n",
      "C= 43 --Average accuracy:  0.815606434993\n",
      "C= 44 --Average accuracy:  0.806662227129\n",
      "C= 45 --Average accuracy:  0.806182932315\n",
      "C= 46 --Average accuracy:  0.80545566596\n",
      "C= 47 --Average accuracy:  0.797964238356\n",
      "C= 48 --Average accuracy:  0.809563990677\n",
      "C= 49 --Average accuracy:  0.804002593625\n",
      "C= 50 --Average accuracy:  0.806659306381\n",
      "C= 51 --Average accuracy:  0.805934376625\n",
      "C= 52 --Average accuracy:  0.804248228566\n",
      "C= 53 --Average accuracy:  0.803519501837\n",
      "C= 54 --Average accuracy:  0.810768507322\n",
      "C= 55 --Average accuracy:  0.805447195789\n",
      "C= 56 --Average accuracy:  0.800862204931\n",
      "C= 57 --Average accuracy:  0.803277663869\n",
      "C= 58 --Average accuracy:  0.803518917687\n",
      "C= 59 --Average accuracy:  0.809561069929\n",
      "C= 60 --Average accuracy:  0.805938757747\n",
      "C= 61 --Average accuracy:  0.806177674967\n",
      "C= 62 --Average accuracy:  0.808352172161\n",
      "C= 63 --Average accuracy:  0.817059215253\n",
      "C= 64 --Average accuracy:  0.795310446349\n",
      "C= 65 --Average accuracy:  0.80786586755\n",
      "C= 66 --Average accuracy:  0.80738686481\n",
      "C= 67 --Average accuracy:  0.799900402479\n",
      "C= 68 --Average accuracy:  0.808108581743\n",
      "C= 69 --Average accuracy:  0.804243263294\n",
      "C= 70 --Average accuracy:  0.80811383909\n",
      "C= 71 --Average accuracy:  0.795298763355\n",
      "C= 72 --Average accuracy:  0.803999964951\n",
      "C= 73 --Average accuracy:  0.803037286274\n",
      "C= 74 --Average accuracy:  0.800382910117\n",
      "C= 75 --Average accuracy:  0.799653891313\n",
      "C= 76 --Average accuracy:  0.811979157539\n",
      "C= 77 --Average accuracy:  0.807625489956\n",
      "C= 78 --Average accuracy:  0.804252025539\n",
      "C= 79 --Average accuracy:  0.801583629789\n",
      "C= 80 --Average accuracy:  0.803518041463\n",
      "C= 81 --Average accuracy:  0.808843149969\n",
      "C= 82 --Average accuracy:  0.813432814024\n",
      "C= 83 --Average accuracy:  0.808601312\n",
      "C= 84 --Average accuracy:  0.802067305726\n",
      "C= 85 --Average accuracy:  0.810287167984\n",
      "C= 86 --Average accuracy:  0.799652430939\n",
      "C= 87 --Average accuracy:  0.81005526056\n",
      "C= 88 --Average accuracy:  0.801097325179\n",
      "C= 89 --Average accuracy:  0.811255980232\n",
      "C= 90 --Average accuracy:  0.802318782165\n",
      "C= 91 --Average accuracy:  0.809323321008\n",
      "C= 92 --Average accuracy:  0.810042993417\n",
      "C= 93 --Average accuracy:  0.809812254292\n",
      "C= 94 --Average accuracy:  0.803757834908\n",
      "C= 95 --Average accuracy:  0.803524175035\n",
      "C= 96 --Average accuracy:  0.804253193838\n",
      "C= 97 --Average accuracy:  0.80400113325\n",
      "C= 98 --Average accuracy:  0.790702381578\n",
      "C= 99 --Average accuracy:  0.797234635403\n"
     ]
    }
   ],
   "source": [
    "spam = scipy.io.loadmat(pathname + 'spam/spam_data_validation.mat')\n",
    "all_validation_accuracy = []\n",
    "all_C = list(range(1, 100))\n",
    "all_training_data = spam['training_data']\n",
    "all_training_labels = spam['training_labels'].ravel()\n",
    "\n",
    "idx = list(range(0,all_training_data.shape[0]))\n",
    "random.shuffle(idx)\n",
    "\n",
    "k = 5\n",
    "idx_k = k_partition(idx, k)\n",
    "\n",
    "for C in all_C:\n",
    "\tk_accuracy = []\n",
    "\tfor i in range(0, k):\n",
    "\t\tvalidation_idx = idx_k[i]\n",
    "\t\ttraining_idx = list(set(validation_idx)^set(idx))\n",
    "\t\ttraining_data = all_training_data[training_idx]\n",
    "\t\ttraining_labels = all_training_labels[training_idx]\n",
    "\t\tvalidation_data = all_training_data[validation_idx]\n",
    "\t\tvalidation_labels = all_training_labels[validation_idx]\n",
    "\t\tclf = svm.LinearSVC(C=C)\n",
    "\t\tclf.fit(training_data, training_labels)\n",
    "\t\tk_accuracy.append(clf.score(validation_data, validation_labels))\n",
    "\tprint(\"C=\", C, \"--Average accuracy: \", sum(k_accuracy)/float(k))\n",
    "\tall_validation_accuracy.append(sum(k_accuracy)/float(k))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "***The C that gives maximum accuracy:  63\n",
      "***Accuracy:  0.817059215253\n"
     ]
    }
   ],
   "source": [
    "max_idx = all_validation_accuracy.index(max(all_validation_accuracy))\n",
    "print(\"***The C that gives maximum accuracy: \", all_C[max_idx])\n",
    "print(\"***Accuracy: \", max(all_validation_accuracy))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Problem 5\n",
    "Using the best model you trained for each dataset, generate predictions for the test sets we provide and save those predictions to .csv files. Upload your predictions to the Kaggle leaderboards (details on Piazza). In your report, include your Kaggle name as it displays on the leaderboard and your Kaggle score for each of the three datasets.\n",
    "\n",
    "*Target: Get as high ranking as possible in Kaggle leaderboards!*"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### MNIST dataset\n",
    "To get better performance, the HOG feature is calculated for MNIST dataset and is used together with the original pixel value as a combined feature in SVM training. First we calculated the feature and store them in a new .mat file. Then the tunning process is repeated on the newly constructed feature to search for optimal C value. And finally we will train the SVM model and make prediction for the test set using all the training data and validation data."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "#Calculate the HOG feature\n",
    "def hog_feature(feature):\n",
    "\timage = feature.reshape(28, 28)\n",
    "\tfd, hog_image = hog(image, orientations=8, pixels_per_cell=(6, 6),\n",
    "                    cells_per_block=(1, 1), visualise=True)\n",
    "\treturn hog_image.ravel()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Validation Set HOG finished.\n",
      "Training Set HOG finished.\n",
      "Test Set HOG finished.\n"
     ]
    }
   ],
   "source": [
    "# Might take a few minutes to run\n",
    "mnist = scipy.io.loadmat(pathname + 'mnist/train_new.mat')\n",
    "validation_data = mnist['validationX'][:, :-1]\n",
    "for i in range(0, len(validation_data)):\n",
    "\tvalidation_data[i] = hog_feature(validation_data[i])\n",
    "print(\"Validation Set HOG finished.\")\n",
    "training_data = mnist['trainX'][:, :-1]\n",
    "for i in range(0, len(training_data)):\n",
    "\ttraining_data[i] = hog_feature(training_data[i])\n",
    "print(\"Training Set HOG finished.\")\n",
    "mnist['trainX'][:, :-1] = training_data\n",
    "mnist['validationX'][:, :-1] = validation_data\n",
    "scipy.io.savemat(pathname + 'mnist/train_hog66.mat', mnist, do_compression=True)\n",
    "\n",
    "# Calculate the HOG feature of test set data\n",
    "test = scipy.io.loadmat(pathname + 'mnist/test.mat')\n",
    "test_data = test['testX']\n",
    "for i in range(0, len(test_data)):\n",
    "\ttest_data[i] = hog_feature(test_data[i])\n",
    "print(\"Test Set HOG finished.\")\n",
    "test['testX'] = test_data\n",
    "scipy.io.savemat(pathname + 'mnist/test_hog66.mat', test, do_compression=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test prediction saved\n"
     ]
    }
   ],
   "source": [
    "pathname = 'hw01_data/'\n",
    "mnist = scipy.io.loadmat(pathname + 'mnist/train_new.mat')\n",
    "mnist_hog = scipy.io.loadmat(pathname + 'mnist/train_hog66.mat')\n",
    "test = scipy.io.loadmat(pathname + 'mnist/test.mat')\n",
    "test_hog = scipy.io.loadmat(pathname + 'mnist/test_hog66.mat')\n",
    "\n",
    "trainX = np.concatenate((mnist_hog['trainX'][:, :-1], mnist['trainX']), axis=1)\n",
    "validationX = np.concatenate((mnist_hog['validationX'][:, :-1], mnist['validationX']), axis=1)\n",
    "allX = np.concatenate((trainX, validationX), axis=0)\n",
    "training_data = allX[:, :-1]\n",
    "training_labels = allX[:, -1:].ravel()\n",
    "test_data = np.concatenate((test_hog['testX'], test['testX']), axis=1)\n",
    "C = 40 # From the new tunning\n",
    "\n",
    "clf = svm.LinearSVC(C=C)\n",
    "clf.fit(training_data, training_labels)\n",
    "test_predict = clf.predict(test_data)\n",
    "\n",
    "# save predict output to mnist_kaggle.csv\n",
    "f = open('mnist_kaggle.csv', 'w')\n",
    "f.write('Id,Category\\n')\n",
    "for i in range(0, len(test_data)):\n",
    "\ts = str(i)+','+str(test_predict[i])+'\\n'\n",
    "\tf.write(s)\n",
    "f.close()\n",
    "print('test prediction saved')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Spam dataset\n",
    "For the Spam dataset, the bag-of-words feature is calculated. To do that, the feature.py is modified to do a two-pass process: in the first pass, scan all the spam/ham documents and record all words that appeared. And during the second pass, we count the file length normalized word frequency in each spam/ham/test document and use that long vector as the feature of each document. The final feature size is about 50,000, which requires a sparse style matrix representation. Fortunately, scikit-learn supports sparse matrix dataset and we can use that directly to train the model as well as predict the test set."
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note: The bag-of-words feature takes about 2 hours to run. Here the modified feature.py is not included and please use the uploaded **spam_data_BOW_validation.mat**."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pathname = 'hw01_data/'\n",
    "spam = scipy.io.loadmat(pathname + 'spam/spam_data_BOW_validation.mat')\n",
    "C = 50 # from cross validation experiment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {
    "collapsed": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "test prediction saved\n"
     ]
    }
   ],
   "source": [
    "training_data = vstack([spam['training_data'], spam['validation_data']])\n",
    "training_labels = np.append(spam['training_labels'].ravel(), spam['validation_labels'].ravel())\n",
    "test_data = spam['test_data']\n",
    "clf = svm.LinearSVC(C=C)\n",
    "clf.fit(training_data, training_labels)\n",
    "test_predict = clf.predict(test_data)\n",
    "# save output file to spam_kaggle.csv\n",
    "f = open('spam_kaggle.csv', 'w')\n",
    "f.write('Id,Category\\n')\n",
    "for i in range(0, len(test_predict)):\n",
    "\ts = str(i)+','+str(test_predict[i])+'\\n'\n",
    "\tf.write(s)\n",
    "f.close()\n",
    "print('test prediction saved')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## ------------------- Kaggle score ----------------\n",
    "### MNIST: 0.96000\n",
    "### Spam: 0.92452"
   ]
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda root]",
   "language": "python",
   "name": "conda-root-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 1
}
